package request

import (
	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/filters"
	"helper-api/app/constant"
)

// DCListRequest docker容器查询
type DCListRequest struct {
	Page       int    `json:"page" binding:"required"` // 当前页码
	Size       int    `json:"size" binding:"required"` // 当前页大小
	OrderField string `json:"orderField"`              // 排序字段 name|createTime|health|status
	Order      bool   `json:"order"`                   // 排序方式 递增/递减
	Name       string `json:"name"`                    // 容器名称
	IsAll      bool   `json:"isAll"`                   // 是否显示全部，默认仅显示正在运行的容器
	Label      string `json:"label"`                   // 标签
	Expose     string `json:"expose"`                  // 暴露的端口
	Exited     string `json:"exited"`                  // 容器退出的状态码
	Health     string `json:"health"`                  // 容器的健康状态 starting|healthy|unhealthy|none
	Network    string `json:"network"`                 // 网络 id/name
	Publish    string `json:"publish"`                 // 端口
	Status     string `json:"status"`                  // 容器状态 created|restarting|running|removing|paused|exited|dead
	Volume     string `json:"volume"`                  // 挂载 volume name
	Id         string `json:"id"`                      // 容器ID
}

func (d *DCListRequest) BuildOptions() types.ContainerListOptions {
	args := filters.NewArgs()
	if d.Id != "" {
		args.Add("id", d.Id)
	}
	if d.Label != "" {
		args.Add("label", d.Label)
	}
	if d.Network != "" {
		args.Add("network", d.Network)
	}
	if d.Volume != "" {
		args.Add("volume", d.Volume)
	}
	if d.Exited != "" {
		args.Add("exited", d.Exited)
	}
	if d.Expose != "" {
		args.Add("expose", d.Expose)
	}
	if d.Publish != "" {
		args.Add("publish", d.Publish)
	}
	if constant.IncludeHealth(d.Health) {
		args.Add("health", d.Health)
	}
	if constant.IncludeStatus(d.Status) {
		args.Add("status", d.Status)
	}
	return types.ContainerListOptions{
		All:     d.IsAll,
		Filters: args,
	}
}

// DCOperateRequest 容器操作
type DCOperateRequest struct {
	Id            string `json:"id"`            // 容器ID
	Way           int    `json:"way"`           // 操作类型
	Name          string `json:"name"`          // 新容器名称
	UserId        int64  `json:"userId"`        // 操作人ID
	RemoveVolumes bool   `json:"removeVolumes"` // 删除挂载卷
	RemoveLinks   bool   `json:"removeLinks"`   // 删除与容器关联的指定链接。
	Force         bool   `json:"force"`         //是否强制删除
}

// DCLogQueryRequest docker日志查询
type DCLogQueryRequest struct {
	Id         string `json:"id" binding:"required"` // 容器ID
	IsAll      bool   `json:"isAll"`                 // 是否获取全部
	TimeAfter  string `json:"timeAfter"`             // 某个时间之后
	TimeBefore string `json:"timeBefore"`            // 某个时间之前
}

// DIListRequest 容器镜像分页查询
type DIListRequest struct {
	Page       int    `json:"page" binding:"required"` // 当前页码
	Size       int    `json:"size" binding:"required"` // 当前页大小
	IsAll      bool   `json:"isAll"`                   // 显示所有图像。默认情况下，只显示最后一层的图像(没有子层)
	Name       string `json:"name"`                    // 镜像搜索
	OrderField string `json:"orderField"`              // 排序属性
	Order      bool   `json:"order"`                   // 排序方式 true：升序 false：降序
}

// DISearchRequest 镜像搜搜
type DISearchRequest struct {
	Name        string `json:"name"`        // 搜索镜像名称
	Limit       int    `json:"limit"`       // 返回的数量
	IsOfficial  int    `json:"isOfficial"`  // 是否官方 0 => false  1 => true  -1 => 不处理
	IsAutomated int    `json:"isAutomated"` // 是否支持持续集成 0 => false  1 => true  -1 => 不处理
	Stars       int    `json:"stars"`       // 最少star数量
}

// DIImageTagRequest 镜像标签查询
type DIImageTagRequest struct {
	ImageName string `json:"imageName" binding:"required"` // 镜像名称
	Page      int    `json:"page" binding:"required"`      // 当前页码
	Size      int    `json:"size" binding:"required"`      // 当前页大小
	Name      string `json:"name"`                         // 搜索名称
	Ordering  string `json:"ordering"`                     // 排序方式
}

// DISetTagRequest 镜像设置tag
type DISetTagRequest struct {
	ImageId string `json:"imageId" binding:"required"` // 镜像ID
	Tag     string `json:"tag" binding:"required"`     // tag
}

// DIExportRequest 镜像导出
type DIExportRequest struct {
	UserId  int64  `json:"userId"`
	ImageId string `json:"imageId" binding:"required" json:"imageId,omitempty"` // 镜像ID
	Path    string `json:"path" json:"path,omitempty"`                          // 导出路径
	NewName string `json:"newName" json:"newName,omitempty"`                    // 导出后的文件名称
}
